let obj:{name:string,age:number};
obj = {
    name:'tom',
    age:18
}
console.log(obj);
/*
当对象数据数据类型规定完毕后，创建的对象必须按照对象规定的数据类型创建，不能多不能少，数据类型不能不同
不符合就报错
*/

//在规定类型时，在属性名后面添加？ 表示该属性可选 可与可无
let obj2:{name:string,age:number,sex?:string}
obj2={
    name:'lili',
    age:18,
    sex:'男'
}
console.log(obj2);

let obj3:{name:string,age:number,[propName:string]:unknown};
obj3 ={
    name:'make',
    age:18,
    sex:'男',
    height:'180'
}
obj3.weight = 160;
console.log(obj3);


//string[]表示当前数组的元素类型都为字符串
let arr : string[];
arr = ['st','gerg','greg'];
//number[]表示当前数组的元素类型都为数组
let arr1:number[];
arr1 = [1,2,3,4,5,6,7]
//Array<number>表示当前数组的元素类型都为number类型          
let arr2:Array<number>;
arr2 = [1,2,3,4,5,6];


//元组 元组类型是一个已知元素数量和类型的数组，各个元素的类型不一定相同

let arr3:[string,number,boolean];
arr3 = ['123',147,false];
console.log(arr3);


//枚举  enum
//对数据类型进行了一个补充，赋予数据类型一组友好的名字，必须为数值类型
//赋值尽量赋值成数字，赋值其他类型报错
enum Color {
    Red,
    Pink,
    Yellow
}
 let monkey:Color = Color.Red;
 console.log(monkey,Color.Pink,Color.Yellow);
 console.log(Color[0],Color[1],Color[2]);

 //手动指定枚举中的值
 enum Color1 {
    Red = 5,
    Pink,
    Yellow
 }
 console.log(Color1[5],Color1.Pink,Color1['Yellow']);

 //类型联合  取值可以是多种类型
 let uu:'zheshu'|'yangyang'|123;
 uu = "zheshu";
 uu = 123;

function boo(a:string | number,b:number):void{
    console.log(a,b);
}
boo(12,45)

//类型断言
//例如一个函数它的参数xx的类型可能是数组也可能是string
// 首先使用了类型联合
function bunnn(x:number | string | string | false){ 
    // 类型断言:手动指定一个值的类型 
    // 语法
    //方式一： <数据类型>值
    //方式二： 值 as 类型  tsx文件当中只能使用这种 
    
    if ((x as string).length){
        console.log(111);
        return (<string>x).length;
    } else {
        console.log(222);
        return x.toString().length;
    }
}
console.log(bunnn(false));

function bunnn1(x: number | string | false) {
    if ((x as string).length) {
        console.log(111);
        return (<string>x).length;
    } else {
        console.log(222);
        return x.toString().length;
    }
}
console.log(bunnn1(false));

// 类型推断 ts中没有明确指定类型时，自动推断出一个数据类型
// 一种：定义变量并且赋值时，推断为对应的数据类型
// 二种：定义变量没有赋值时，推断它的类型为any
let apple = 'pingguo';

let appleA;
appleA = 13;
appleA = 'gerg';


// ts中的基本数据类型有哪些：number string Boolean 字面量 any unknown void object array 元组 enum 类型联合 类型断言 类型推断


